package main

// 基本操作
import (
	"github.com/go-redis/redis/v8"
	"fmt"
	"context"
	"time"
)

//Background返回一个非空的Context。 它永远不会被取消，没有值，也没有期限。 
//它通常在main函数，初始化和测试时使用，并用作传入请求的顶级上下文。
var ctx = context.Background()
func main() {
	
	// 连接redis
	rdb := redis.NewClient(
		&redis.Options{
			Addr: "127.0.0.1:6379",
			Password: "root",
			DB : 0,
		})
	// 测试连接
	pong , err := rdb.Ping(ctx).Result()
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(pong)
	fmt.Println("连接成功")


	fmt.Println("-------------")

	// 设置key
	err = rdb.Set(ctx, "name", "zhou", 0).Err()
	if err != nil {
		fmt.Println(err)
	}

	// 查看当前key的数量
	nums, err := rdb.DBSize(ctx).Result()
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(nums)
	fmt.Println("-------------")

	// 查询key
	res, err := rdb.Get(ctx, "name").Result()
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(res)
	fmt.Println("-------------")


	// 正则查询全部
	var arr []string
	arr, _ = rdb.Keys(ctx, "*").Result()
	fmt.Println(arr)
	fmt.Println("-------------")

	// 查询值类型
	vType, err := rdb.Type(ctx, "name").Result()
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(vType)
	fmt.Println("-------------")

	// 设置过期时间
	expireTime, err := rdb.Expire(ctx, "name", time.Second * 10).Result()
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(expireTime)
	fmt.Println("-------------")

	time.Sleep(time.Second * 5)
	// 获取剩余有效期  ==> ms
	pttl, err :=rdb.PTTL(ctx, "name").Result()
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(pttl)
	fmt.Println("-------------")
	// 获取剩余有效期  ==> ms
	ttl, err :=rdb.TTL(ctx, "name").Result()
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(ttl)
	fmt.Println("-------------")
	// 删除key
	del, err := rdb.Del(ctx, "name").Result()
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(del)
	fmt.Println("-------------")

	// 查看当前key的数量
	nums, err = rdb.DBSize(ctx).Result()
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(nums)
	fmt.Println("-------------")
}